Assembly language is a low-level programming language for a computer (or other programmable device), typically with a one-to-one correspondence between the language and the machine code instructions. Each assembly language is specific to a particular computer architecture. High-level computer programming languages are generally portable across multiple machine architectures but require converting into low-level assembly language code. This process is called compiling. Low-level assembly language code is converted into a non-executable machine code object by an assembler. This conversion process is called assembling, or assembling the low-level assembly language source code. The non-executable machine code objects are then combined together with library object code using a tool known as a linker. This process is called linking.
Assembly languages use mnemonics to represent each low-level machine instruction or operation. Typical operations require one or more operands in order to form a complete instruction; most assemblers can therefore take labels, symbols and expressions as operands to represent addresses and other constants. Many assemblers offer additional mechanisms to facilitate program development, to control the assembly process, and to aid debugging.
However, correlating low-level assembly language code back to the original high-level language source code is difficult, because some high-level constructs, such as template declarations, have no direct representation in the resultant low-level assembly language code. For example, instantiation of template declarations are embedded in the low-level assembly language code with no correlation back to the original high-level language source code. Therefore it is not currently possible to correlate template instantiations with template declarations. Similar problems exist with inline functions and compiler function-like preprocessor macros. There is currently no automatic way to perform the full correlation and all known techniques are ad-hoc in design. It is currently possible to associate assembly language code labels with function names and certain code constructs such as normal functions and global variables. However, template declarations, inline functions, and preprocessor function-like macros lose correlation during compilation of original high-level source code, as a necessary and expected function of compilation.